#ifndef __RADAR_USER_DEF_H
#define __RADAR_USER_DEF_H

#if 1 /* 调试配置 */
// 0- 无调试数据
// 1- 时域chirps输出
// 2- 时域CHIRP输出
// 3- 时域CHIRPS帧输出
// 4- FFT1D帧输出
// 5- FFT1D均值输出
// 6- FFT2D输出
// 7- cfar输出
// 8- FFT3D 点云输出

//100-通用输出测试
//200-频谱测试
//201-待机功耗测试
//202-待机功耗测试 flash:deep_sleep
//203-整机功耗测试
//204-整机功耗测试 无点云发送
//300-采样执行时间测试
//400-基带处理执行时间测试
//500-时域伪浮点输出模式

#define TEST_MODE (0)

#define TEST_OUTPUT_N_FRAME (1) // 每N帧输出一次结果

#include "../app_rsv/board_define.h" // 板级编号定义

#define BOARD_CFG_SELECT  (BD_EVM2) // BD_DEV、BD_EVM2、BD_EVM3、BD_EVM4、BD_USR0、BD_USR2、BD_USR3、BD_USR4
#define SWEEP_TIME_SELECT (0)       // 0-28us@250M  1-53us@250M 2-60us@250M  3-60us@800M(本项未测试)


#define FRAME_INTV_MS (300)   // 帧周期(ms) 
#define SEC_TO_FRAME_CNT(x) ((x*1000)/FRAME_INTV_MS) // 秒


#define RADAR_MOTION_DETECT        // 默认微动，可选微动+运动
#if defined(RADAR_MOTION_DETECT)
#define UDFDEF_MOTION_CHIRP_NUM    ( 2 ) // 1-减上个chirp 2-减上个、上上个
#endif
//#define RADAR_USE_ANT1_AND_ANT2          // 可选使用双天线触发

#define FFT2D_MINUS_MEAN (1)             // 0-不减均值 1-减均值
//#define CUSTOM_DATA_ENABLE

#if TEST_MODE > 0
#define DEBUG_DATA_ENABLE
#if defined(LOG_LEVEL)
#undef LOG_LEVEL
#define LOG_LEVEL (LOG_LEVEL_EMERG)
#endif
#ifndef TEST_MODE_FRAME_FILTER
#define TEST_MODE_FRAME_FILTER(x,y) ((x%y)==0)
#endif
#endif

#ifdef  CUSTOM_DATA_ENABLE     /* 客制化数据配置 */
#if !defined(CUSTOM_DATA_ANT_FILTER)  // ==1: 天线1 ==2:天线2  <3:天线1&2
#define CUSTOM_DATA_ANT_FILTER(x)     (x==1)
#endif
// 客制化数据输出接口
#define CUSTOM_DATA_INTERFACE         (0) // 0 uart  1 spi
// 客制化数据输出格式
#define CUSTOM_DATA_FORMAT_ROW_COLUMN (0) // 0 chirp-row 1 chirp-column
// 客制化数据输出协议       暂用调试数据协议
#define CUSTOM_DATA_PROTOCOL_VER      (0) // 0-raw data 1-v1.0 protocol 2-v2.x protocol
#endif


#if defined(DEBUG_DATA_ENABLE) /* 调试数据配置 */
#if !defined(DEBUG_DATA_ANT_FILTER)  // ==1: 天线1 ==2:天线2  <3:天线1&2
#define DEBUG_DATA_ANT_FILTER(x)     (x==1)
#endif
// 调试数据输出帧协议
#define DEBUG_DATA_PROTOCOL_VER      (1) // 0-raw data 1-v1.0 protocol 2-v2.0 protocol
// 调试数据输出格式
#define DEBUG_DATA_FORMAT_ROW_COLUMN (0) // 0 chirp-row 1 chirp-column
// 调试数据输出接口
#define DEBUG_DATA_INTERFACE         (0) // 0 uart  1 spi
#endif

#endif

#if 1 /* 雷达配置 */

//#define DEMO_RANGE_REFINEMENT     // 暂未实现该宏功能

//#define WINRANGE_ENABLE             // 距离加窗开关
#define WINVEL_ENABLE               // 速度加窗开关

#if defined(WINRANGE_ENABLE)

#if SWEEP_TIME_SELECT != 3
#define FLASH_WINRANGE              // 使用自定义距离窗
#endif

#endif

#if defined(WINVEL_ENABLE)
//#define FLASH_WINVEL              // 使用自定义速度窗  暂未实现该宏
#endif

#endif

#if 1 /* 雷达参数 & 内存分配 */

#define OTA_STATUS_IDLE        (0)
#define OTA_STATUS_DOWNLOAD    (1)
#define OTA_STATUS_OTA_WRITE   (2)
#define OTA_STATUS_INFO_WRITE  (3)
#define CNT_TIME 180

#define UDPCFG_SYNCW                        ( 0x0a19FF00 ) // 2us、5us、51us、0us // 3 2 1 0
//#define UDPCFG_SYNCW                        ( 0x0000FF00 )
#define UDPCFG_CHIRPW                       ( 0x000000FF )

#ifdef TEST_RF_PW
#define UDPCFG_RAMP_WM                      ( UDP_CFG_RAMP_WAVE0_WAVE1_INF )
#else
//#define UDPCFG_RAMP_WM                      ( UDP_CFG_RAMP_WAVE0_WAVE1_ONCE )
#define UDPCFG_RAMP_WM                        ( UDP_CFG_RAMP_WAVE0_WAVE1_INF | UDFDEF_CHIRP_NUM )
#endif
#define UDFDEF_RAMP_CNT                     ( UDFDEF_CHIRP_SUM_NUM )
#define UDFDEF_CYCLE_NUM                    ( 1 )
								   
#define UDFDEF_ADCSAMP_NUM                  ( 1<<UDFDEF_ADCSAMP_NUMLOG )
#define UDFDEF_CHIRP_SUM_NUM                ( 1 ) // max:16chirp
#define UDFDEF_CHIRP_NUM                    ( 1 )
#define UDFDEF_ANT_NUM                      ( DEMO_RX_ANT_NUM )
#define UDFDEF_ONE_ANT                      ( 1 )		
#define UDFDEF_VEL_NUM                      ( 16 ) // 16/32

#if   (BOARD_CFG_SELECT==BD_EVB)
#include "./BD/evb_1t2r.h"
#elif   (BOARD_CFG_SELECT==BD_EVM2)
#include "./BD/evm2_1t2r.h"
#elif   (BOARD_CFG_SELECT==BD_EVM3)
#include "./BD/evm3_1t2r.h"
#elif   (BOARD_CFG_SELECT==BD_EVM4)
#include "./BD/evm4_1t1r.h"
#elif (BOARD_CFG_SELECT==BD_USR0)
#include "./BD/user0_1t1r.h"
#elif (BOARD_CFG_SELECT==BD_USR2)
#include "./BD/user2_1t1r.h"
#elif (BOARD_CFG_SELECT==BD_USR3)
#include "./BD/user3_1t2r.h"
#elif (BOARD_CFG_SELECT==BD_USR4)
#include "./BD/user4_1t2r.h"
#else
#error unknown BOARD_CFG_SELECT
#endif

#if defined( UDPCFG_DP_CFG0 )  // 本demo强制2条天线都采集
#undef UDPCFG_DP_CFG0
#define UDPCFG_DP_CFG0            ( (2/*UDFDEF_ANT_NUM*/ - 1)<< 28 |(UDFDEF_RAMP_CNT - 1) << 20 | UDFDEF_ADCSAMP_NUMLOG      << 16 |	UDFDEF_ADCSAMP_OFFSET      << 8 |	 0 << 2 | 0 << 0)
#endif

#if UDFDEF_ANT_NUM < 2
#if defined(RADAR_USE_ANT1_AND_ANT2)
#undef RADAR_USE_ANT1_AND_ANT2
#endif
#endif

#define BBE_ABUF0_BASE_ADDR            (0x30000000)
#define BBE_ABUF1_BASE_ADDR            (0x30004000)
#define BBE_ABUF2_BASE_ADDR            (0x30008000)

#define UDFDEF_SIZE_MAX_ABUF0          (16*1024)
#define UDFDEF_SIZE_MAX_ABUF1          (16*1024)
#define UDFDEF_SIZE_MAX_ABUF2          ( 8*1024)

/*demo BBSRAM 分区说明 */
// ABUF0 分为三个区，A区放置 持久伪浮点ADC数据;B区放置临时数据;C区持久放置UDF13的代码
#define UDFDEF_BASE_ABUF0_A          ( BBE_ABUF0_BASE_ADDR )
#define UDFDEF_SIZE_MAX_ABUF0_A      ( 8*1024 + 512 )

#define UDFDEF_BASE_ABUF0_B          ( UDFDEF_BASE_ABUF0_A + UDFDEF_SIZE_MAX_ABUF0_A )
#define UDFDEF_SIZE_MAX_ABUF0_B      ( 1*1024 + 512 )

#define UDFDEF_BASE_ABUF0_C          ( UDFDEF_BASE_ABUF0_B + UDFDEF_SIZE_MAX_ABUF0_B )
#define UDFDEF_SIZE_MAX_ABUF0_C      ( 6*1024 )

#if UDFDEF_SIZE_MAX_ABUF0_A + UDFDEF_SIZE_MAX_ABUF0_B + UDFDEF_SIZE_MAX_ABUF0_C > UDFDEF_SIZE_MAX_ABUF0
#error xxxx
#endif

// abuf1 分为4个区：其中A区放置ANT1 1D/2D/1D_DIFF,B区未用,C区放置持久化数据，D区放置 ANT2 1D/2D/1D_DIFF
#define UDFDEF_BASE_ABUF1_A          ( BBE_ABUF1_BASE_ADDR )
#define UDFDEF_SIZE_MAX_ABUF1_A      ( 4*1024 + 512 )

#define UDFDEF_BASE_ABUF1_B          (UDFDEF_BASE_ABUF1_A + UDFDEF_SIZE_MAX_ABUF1_A)
#define UDFDEF_SIZE_MAX_ABUF1_B      ( 4*1024 + 512 )

#define UDFDEF_BASE_ABUF1_C          (UDFDEF_BASE_ABUF1_B + UDFDEF_SIZE_MAX_ABUF1_B)
#define UDFDEF_SIZE_MAX_ABUF1_C      ( 2*1024 + 512 )

#define UDFDEF_BASE_ABUF1_D          ( UDFDEF_BASE_ABUF1_C + UDFDEF_SIZE_MAX_ABUF1_C )
#define UDFDEF_SIZE_MAX_ABUF1_D      ( 4*1024 + 512 )

#if UDFDEF_SIZE_MAX_ABUF1_A + UDFDEF_SIZE_MAX_ABUF1_B + UDFDEF_SIZE_MAX_ABUF1_C + UDFDEF_SIZE_MAX_ABUF1_D > UDFDEF_SIZE_MAX_ABUF1
#error xxxx
#endif

// ABUF2 分为两个区, A区放置 ADC原始数据/其它临时数据;B区放置持久化数据;
#define UDFDEF_BASE_ABUF2_A          ( BBE_ABUF2_BASE_ADDR )
#define UDFDEF_SIZE_MAX_ABUF2_A      ( 4*1024 )

#define UDFDEF_BASE_ABUF2_B          ( UDFDEF_BASE_ABUF2_A + UDFDEF_SIZE_MAX_ABUF2_A )
#define UDFDEF_SIZE_MAX_ABUF2_B      ( 4*1024 )

#if UDFDEF_SIZE_MAX_ABUF2_A + UDFDEF_SIZE_MAX_ABUF2_B > UDFDEF_SIZE_MAX_ABUF2
#error xxxx
#endif

/*stage 0：持久数据、8bit adc数据采集、伪浮点adc数据存储 */

#define UDFDEF_SIZE_POINT_RST          ( FRAME_MAX_NUM*8+12 )

// ABUF2 B区 持久数据
#define UDFDEF_ADDR_POINT_RST          ( UDFDEF_BASE_ABUF2_B ) //1K+12
#define UDFDEF_ADDR_WIN_RANGE          ( UDFDEF_ADDR_POINT_RST + UDFDEF_SIZE_POINT_RST ) // 512
#define UDFDEF_ADDR_WIN_VEL            ( UDFDEF_ADDR_WIN_RANGE + MAX_WIN_RANGE*NUM_BYTE16 ) // 512
#define UDFDEF_SIZE_WIN_VEL            ( MAX_WIN_VEL*NUM_BYTE16 )

#if UDFDEF_ADDR_WIN_VEL + UDFDEF_SIZE_WIN_VEL > UDFDEF_BASE_ABUF2_B + UDFDEF_SIZE_MAX_ABUF2_B
#error xxxxx
#endif

// ABUF1 C区 持久数据
#define UDFDEF_SIZE_ANGLE_ARRAY        ( NUM_ANGLE*ANT_MAX_NUM*NUM_BYTE32 )

#if 0 // TODO
#define UDFDEF_ADDR_CHIRPSUM_NOW       ( UDFDEF_BASE_ABUF1_C )
#define UDFDEF_ADDR_ANGLE_ARRAY        ( UDFDEF_ADDR_CHIRPSUM_NOW + UDFDEF_SIZE_CHIRPSUM_PER_CHIRP)
#else
#define UDFDEF_ADDR_ANGLE_ARRAY        ( UDFDEF_BASE_ABUF1_C )
#endif
#define UDFDEF_ADDR_POINT_RST_MOTION   ( UDFDEF_ADDR_ANGLE_ARRAY + UDFDEF_SIZE_ANGLE_ARRAY )
#define UDFDEF_ADDR_COEF_TEMP1         ( UDFDEF_ADDR_POINT_RST_MOTION + UDFDEF_SIZE_POINT_RST )

#if UDFDEF_ADDR_COEF_TEMP1 + 8 > UDFDEF_BASE_ABUF1_C + UDFDEF_SIZE_MAX_ABUF1_C
#error xxxx
#endif

// ABUF2 A区 8bit adc数据采集
#define UDFDEF_ADDR_ADCSAMP            ( UDFDEF_BASE_ABUF2_A )
#define UDFDEF_SIZE_ADCSAMP            ( UDFDEF_ADCSAMP_NUM*2/*UDFDEF_ANT_NUM*/*UDFDEF_CHIRP_SUM_NUM) // 本demo强制adc两条天线

#if UDFDEF_SIZE_ADCSAMP > UDFDEF_SIZE_MAX_ABUF2_A
#error xxxx
#endif

// ABUF0 A区 伪浮点adc数据
#define UDFDEF_SIZE_CHIRPSUM_PER_CHIRP ( UDFDEF_ADCSAMP_NUM*NUM_BYTE32*UDFDEF_ANT_NUM)
#define UDFDEF_SIZE_CHIRPSUM           ( UDFDEF_SIZE_CHIRPSUM_PER_CHIRP*UDFDEF_CHIRP_NUM)

#define UDFDEF_ADDR_CHIRPSUM           ( UDFDEF_BASE_ABUF0_A )
#if UDFDEF_SIZE_CHIRPSUM > UDFDEF_SIZE_MAX_ABUF0_A
#error xxxx
#endif

/*stage 1: 临时数据*/

// abuf0 B区
#define UDFDEF_SIZE_FFT1D_MEAN_PER_ANT      ( UDFDEF_RANGE_USE*NUM_BYTE32 )

#define UDFDEF_ADDR_COEF_TEMP0              ( UDFDEF_BASE_ABUF0_B )
#define UDFDEF_ADDR_FFT1D_MEAN              ( UDFDEF_ADDR_COEF_TEMP0 + 8)
#define UDFDEF_ADDR_FFT1D_CALIB_ANT2        ( UDFDEF_ADDR_FFT1D_MEAN_ANT2 + UDFDEF_SIZE_FFT1D_MEAN_PER_ANT*UDFDEF_ANT_NUM )

#define UDFDEF_ADDR_FFT1D_MEAN_ANT1         ( UDFDEF_ADDR_FFT1D_MEAN )
#define UDFDEF_ADDR_FFT1D_MEAN_ANT2         ( UDFDEF_ADDR_FFT1D_MEAN_ANT1 + UDFDEF_SIZE_FFT1D_MEAN_PER_ANT )

#if UDFDEF_ADDR_FFT1D_CALIB_ANT2 + UDFDEF_SIZE_FFT1D_MEAN_PER_ANT > UDFDEF_BASE_ABUF0_B+UDFDEF_SIZE_MAX_ABUF0_B
#error xxxx
#endif

// abuf2 A区

#define UDFDEF_ADDR_FFT1D_ANT1_ADD_ANT2_TMP    ( UDFDEF_BASE_ABUF2_A )
#define UDFDEF_ADDR_FFT1D_ANT1_MINUS_ANT2_TMP  ( UDFDEF_ADDR_FFT1D_ANT1_ADD_ANT2_TMP + UDFDEF_SIZE_FFT1D_PER_CHIRP_ANT )
#define UDFDEF_ADDR_ANT2_AP_PSF                ( UDFDEF_ADDR_FFT1D_ANT1_MINUS_ANT2_TMP + UDFDEF_SIZE_FFT1D_PER_CHIRP_ANT )

#if UDFDEF_ADDR_ANT2_AP_PSF + 4 > UDFDEF_BASE_ABUF2_A+UDFDEF_SIZE_MAX_ABUF2_A
#error xxxx
#endif

/*stage 1: fft1d、fft2d 等*/

// abuf1 A区/D区
#define UDFDEF_SIZE_FFT1D_PER_CHIRP_ANT   ( UDFDEF_RANGE_USE*NUM_BYTE32 )
#define UDFDEF_SIZE_FFT1D_PER_ANT         ( UDFDEF_SIZE_FFT1D_PER_CHIRP_ANT*UDFDEF_CHIRP_NUM )
#define UDFDEF_SIZE_FFT2D_PER_ANT         ( UDFDEF_RANGE_USE*NUM_BYTE32*UDFDEF_VEL_NUM )

#define UDFDEF_ADDR_FFT1D_ANT1            ( UDFDEF_BASE_ABUF1_A )
#define UDFDEF_ADDR_FFT1D_ANT2            ( UDFDEF_BASE_ABUF1_D )
#define UDFDEF_ADDR_FRAME_RECOVER_FFT1D_OLD ( BBE_ABUF0_BASE_ADDR + 8*1024)
#define UDFDEF_ADDR_FFT1D_MINUS           ( BBE_ABUF2_BASE_ADDR )
#define UDFDEF_ADDR_FFT2D_ANT1            ( UDFDEF_ADDR_FFT1D_ANT1 )
#define UDFDEF_ADDR_FFT2D_ANT2            ( UDFDEF_ADDR_FFT1D_ANT2 )

#if defined(RADAR_MOTION_DETECT)

#define UDFDEF_SIZE_FFT1D_DIFF_PER_CHIRP_ANT  ( UDFDEF_RANGE_USE*NUM_BYTE32 )
#define UDFDEF_SIZE_FFT1D_DIFF_PER_ANT        ( UDFDEF_SIZE_FFT1D_DIFF_PER_CHIRP_ANT*UDFDEF_MOTION_CHIRP_NUM )

#define UDFDEF_ADDR_FFT1D_DIFF_ANT1           ( UDFDEF_ADDR_FFT2D_ANT1 + UDFDEF_SIZE_FFT2D_PER_ANT )   
#define UDFDEF_ADDR_FFT1D_DIFF_ANT2           ( UDFDEF_ADDR_FFT2D_ANT2 + UDFDEF_SIZE_FFT2D_PER_ANT )

#define UDFDEF_SIZE_MAX_FFT1D_FFT2D_FFT1DDIFF ( UDFDEF_SIZE_FFT2D_PER_ANT + UDFDEF_SIZE_FFT1D_DIFF_PER_ANT)
#else
#define UDFDEF_SIZE_MAX_FFT1D_FFT2D_FFT1DDIFF ( UDFDEF_SIZE_FFT2D_PER_ANT )
#endif

#if (UDFDEF_SIZE_MAX_FFT1D_FFT2D_FFT1DDIFF > UDFDEF_SIZE_MAX_ABUF1_A) || (UDFDEF_SIZE_MAX_FFT1D_FFT2D_FFT1DDIFF > UDFDEF_SIZE_MAX_ABUF1_D)
#error xxxx
#endif



#define UDFDEF_ADDR_FFT1D_ANT1_ADD_ANT2   ( UDFDEF_ADDR_FFT1D_ANT1 )
#define UDFDEF_ADDR_FFT1D_ANT1_MINUS_ANT2 ( UDFDEF_ADDR_FFT1D_ANT2 )


/* stage2：cfar、fft3d */

#define UDFDEF_ADDR_ANGLE_PRE           ( UDFDEF_BASE_ABUF0_B )
#define UDFDEF_SIZE_ANGLE_PRE           ( FRAME_MAX_NUM*ANT_MAX_NUM*NUM_BYTE32 )

#if (UDFDEF_ADDR_ANGLE_PRE + UDFDEF_SIZE_ANGLE_PRE) > (UDFDEF_BASE_ABUF0_B + UDFDEF_SIZE_MAX_ABUF0_B)
#error xxxx
#endif

#define UDFDEF_SIZE_CFAR_CACHE          ( CFAR_MAX_NUM*NUM_BYTE32 )

#define UDFDEF_ADDR_CFAR1_CACHE         ( UDFDEF_BASE_ABUF2_A )
#define UDFDEF_ADDR_CFAR2_CACHE         ( UDFDEF_ADDR_CFAR1_CACHE + UDFDEF_SIZE_CFAR_CACHE )
#define UDFDEF_ADDR_TEMP                ( UDFDEF_ADDR_CFAR2_CACHE + UDFDEF_SIZE_CFAR_CACHE )
#define UDFDEF_SIZE_TEMP                ( 1*1024+512 )

#if (UDFDEF_ADDR_TEMP + UDFDEF_SIZE_TEMP) > (UDFDEF_BASE_ABUF2_A + UDFDEF_SIZE_MAX_ABUF2_A)
#error xxxx
#endif

#define UDFDEF_ADDR_ANGLE_RSLT          ( UDFDEF_BASE_ABUF2_A )

/* stage3: 后处理*/
#define UDFDEF_ADDR_EPC_STRUCT          ( UDFDEF_ADDR_FFT1D_ANT1 ) // 随意哪个非持久区都可 注意不要和点云地址重叠


/*固定部分*/
#if defined(UDF13_AT_BB_SRAM) && (ENABLE_UDF13>0)
#if ANA4_VDD12_DIS > 0
#undef ANA4_VDD12_DIS
#define ANA4_VDD12_DIS (0)
#endif
#endif

#endif

#endif
